package com.guw.TestReflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

//通过反射动态的创建对象
public class Test02 {
    public static void main(String[] args) throws Exception {
        //获得Class对象
        Class c1 = Class.forName("com.guw.TestReflection.User");
        //第一种方式构造一个对象,需要无参构造方法:
        User user1 = (User)c1.newInstance();//本质是调用了类的无参构造器
        System.out.println(user1);
        //第二种方式构造一个对象:
        Constructor constructor = c1.getDeclaredConstructor(String.class,int.class,int.class);
        User user2 = (User) constructor.newInstance("zhangsan",001,18);
        System.out.println(user2);

        //通过反射调用普通方法
        User user3 = (User)c1.newInstance();
        //通过反射获取一个方法
        Method setName = c1.getDeclaredMethod("setName",String.class);
        //激活传入对象和方法所需参数
        setName.invoke(user3,"lisi");
        System.out.println(user3.getName());

        //通过反射操作属性
        User user4 = (User)c1.newInstance();
        //获取属性
        Field name = c1.getDeclaredField("name");
        //关闭程序的安全监测,否则被private修饰的属性将无法用set方法修改
        name.setAccessible(true);
        //通过方法修改属性
        name.set(user4,"wangwu");
        System.out.println(user4.getName());
    }
}
